/*
 * @(#)ModQueryList.java 1.00 7 Sep 2007
 *
 * Copyright (c) 2005-2007 Soluciones Info Móviles S.A.C.
 * Av. Javier Prado Oeste 203 - Piso 13, Lima 27, Perú.
 * Todos los derechos reservados.
 */

package sim.query;

import sim.framework.*;
import sim.framework.io.FileStream;
import sim.store.DataTxt;
import sim.utils.Utils;

/**
 * Abre una lista y la pinta su contenido en pantalla.
 *
 * @author      Omar Quintana
 * @since       1.0
 */
public abstract class ModQueryList extends ModQuery {
    
    private static final int LINE_MAX_LENGTH = 64;
    private static final int LINE_INIT_SIZE = 2;
    
    private FileStream  m_File;
    private DataTxt     m_Data;
    private byte[]      m_Line;
    
    /**
     * Crea una nueva instancia de ModQueryList
     */
    public ModQueryList(int i, Simlet s) {
        super(i, s);
        m_Data = new DataTxt(Utils.TOKEN, Utils.TOKEN_COLON, 1,
                LINE_INIT_SIZE, s.getAppEncoding());
        m_Line    = new byte[LINE_MAX_LENGTH];
    }
    
    public void work(final Msg msg) {
        switch (msg.getWParam()) {
            case STATE_INIT:
                workInit(msg);
            default:
                super.work(msg);
        }
    }
    
    /**
     * Método llamado cuando se llama a #work() con estado
     * <code>STATE_INIT</code>.
     */
    private void workInit(final Msg msg) {
        m_File = queryListOpen();
        if (m_File == null) {
            execBack();
        }
        super.work(msg);
    }
    
    /**
     * Busca un elemento del archivo y selecciona el item.
     */
    protected int querySearch() {
        int length;
        length = m_File.gets(m_Line);
        if (length > 0) {
            if (m_Data.make(m_Line, 0, length) > 0) {
                setItem(m_File.getOffset() - length,
                        queryListGetLbl(m_Data),
                        false,
                        null);
                return ModQuery.QUERY_OK;
            }
            return ModQuery.QUERY_IGNORE;
        }
        return ModQuery.QUERY_STOP;
    }
    
    
    protected final void queryGoToNext() {
        queryListClose();
        queryListGoToNext();
    }
    
    protected final void queryGoToBack() {
        queryListClose();
        queryListGoToNext();
    }
    
    protected final void queryListClose() {
        if (m_File != null) {
            m_File.close();
            m_File = null;
        }
    }
    
    protected void queryListGoToNext() {
        execNext();
    }
    
    protected void queryListGoToBack() {
        execBack();
    }    
    
    /**
     * Abre un archivo *.lst del disco.
     *
     * @return      una archivo.
     */
    protected abstract FileStream queryListOpen();
    
    /**
     * Callback llamado cuando se encuentra una coincidencia en la
     * búsqueda.
     *
     * @return      un entero con el estado de la tarea, puede ser
     *              ModQuery.QUERY_OK o ModQuery.QUERY_IGNORE.
     */
    protected abstract String queryListGetLbl(DataTxt data);
    
    
}
